package cn.iocoder.yudao.module.eval.service.score;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.eval.controller.admin.score.vo.EvalScoreSummaryPageReqVO;
import cn.iocoder.yudao.module.eval.controller.admin.score.vo.EvalScoreSummarySaveReqVO;
import cn.iocoder.yudao.module.eval.dal.dataobject.score.EvalScoreSummaryDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 成绩汇总 Service 接口
 *
 * @author 芋道源码
 */
public interface EvalScoreSummaryService {

    /**
     * 创建成绩汇总
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createScoreSummary(@Valid EvalScoreSummarySaveReqVO createReqVO);

    /**
     * 更新成绩汇总
     *
     * @param updateReqVO 更新信息
     */
    void updateScoreSummary(@Valid EvalScoreSummarySaveReqVO updateReqVO);

    /**
     * 删除成绩汇总
     *
     * @param id 编号
     */
    void deleteScoreSummary(Long id);

    /**
     * 获得成绩汇总
     *
     * @param id 编号
     * @return 成绩汇总
     */
    EvalScoreSummaryDO getScoreSummary(Long id);

    /**
     * 获得成绩汇总分页
     *
     * @param pageReqVO 分页查询
     * @return 成绩汇总分页
     */
    PageResult<EvalScoreSummaryDO> getScoreSummaryPage(EvalScoreSummaryPageReqVO pageReqVO);

    /**
     * 获得成绩汇总列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 成绩汇总列表
     */
    List<EvalScoreSummaryDO> getScoreSummaryList(EvalScoreSummaryPageReqVO exportReqVO);

    /**
     * 根据计划ID获得成绩汇总列表
     *
     * @param planId 计划ID
     * @return 成绩汇总列表
     */
    List<EvalScoreSummaryDO> getScoreSummaryListByPlanId(Long planId);

    /**
     * 计算成绩汇总
     *
     * @param planId 计划ID
     */
    void calculateScoreSummary(Long planId);

    /**
     * 批量计算成绩汇总
     *
     * @param planIds 计划ID列表
     */
    void batchCalculateScoreSummary(List<Long> planIds);

    /**
     * 复核成绩汇总
     *
     * @param id 编号
     * @param reviewResult 复核结果
     * @param reviewComments 复核意见
     */
    void reviewScoreSummary(Long id, String reviewResult, String reviewComments);

    /**
     * 获取成绩统计数据
     *
     * @param planId 计划ID
     * @return 统计数据
     */
    Object getScoreSummaryStatistics(Long planId);

}
